#ifndef __AO_TEST_H__
#define __AO_TEST_H__
#include <stdint.h>
#include <limits.h>
#include "thread_ctrl.h"

#define AO_ITEM_NAME            "AO"
#define AO_ITEM_NUM             (1 + 2)
#define AO_ARGV_OFFSET          2
#define AO_DRV_NAME             "pcie_ao"
#define AO_MAX_NUM              32

/* 脉冲参数 */
struct ao_pulse_t {
    uint16_t high;          /* 脉冲高时间, us */
    uint16_t cycle;         /* 脉冲周期, us */
};

/* 电流参数 */
struct ao_current_t {
    int32_t val;            /* 电流值, mA */
    uint16_t cycle;         /* 脉冲周期, us */
};


/* 设备 */
struct ao_dev_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t index;                          /* 索引号 */

    double set_val;                         /* 配置值, mA */

    char path[PATH_MAX];                    /* 路径 */
    int fd;                                 /* 文件 */
    struct thread_param_t *write_thread;    /* 发送线程 */
};

/* 信息 */
struct ao_param_t {
    void *parent;                           /* 父指针 */
    char name[32];                          /* 设备名 */
    uint8_t dev_id;                         /* 设备索引号 */
    uint8_t dev_num;                        /* 设备数量 */
    uint8_t max_num;                        /* 最大数量 */
    uint8_t type;                           /* 模块类型 */

    struct ao_dev_t *dev;                   /* AO 设备 */
    double set_val;                         /* 配置值, mA */

    uint8_t item_id;                        /* 测试项目号 */
    uint8_t en_write;                       /* 使能发送 */
    int write_cnt;                          /* 发送数量 */
};

struct ao_item_t {
    struct thread_info_t *thread;
    struct ao_param_t *param;
};

int ao_test(int argc, char *argv[]);

#endif /* __AO_TEST_H__ */
